#!/usr/bin/perl
use strict;

use Test::More 'no_plan';

=head1 NAME

Anonymous Brick use case

=head1 SYNOPSIS

=cut

my $class = 'Brick';
use_ok( $class );

my $brick = $class->new();
isa_ok( $brick, $class );

my $bucket = $class->bucket_class->new;

=head1 DESCRIPTION

I don't always need a named nethods to compose functions, as long as I
know the name I gave it when I created it.

First, I need to create a brick that doesn't live in a named
subroutine. I can do that with C<add_to_bucket>. I name it C<FooSub>,
and that's how I'll get to it later. I'll make sure the I get the
right one by declaring that the name is unique.

=cut

my $unnamed_sub = $bucket->add_to_bucket( {
	name        => "FooSub",
	unique      => 1,
	description => "This is a brick that isn't attached to a sub name",
	code        => sub { 
		$_[0]->{number} == 3 ? 1 : die {
			handler => 'FooSub',
			message => "Number wasn't 3",
			}
		},
	} );
	
isa_ok( $unnamed_sub, ref sub {} );

=pod

Later on, I want to use C<FooSub> in a composition, but I'm in some different
scope and I can't use the return value from C<add_to_bucket>. I make sure
I call C<get_brick_by_name> in list context, and since it's a unique name
I know that I'll only get a single code reference back.

=cut

my( $foo_sub ) = $bucket->get_brick_by_name( 'FooSub' );
is( $foo_sub, $unnamed_sub, "I get the same sub back" );

=pod

Now that I have my code reference for C<FooSub>, I can use it in a 
composition (or even inside another subroutine).

=cut

my $composed = $bucket->__compose_satisfy_all( $foo_sub );
isa_ok( $composed, ref sub {} );

=pod

I might even use this in a named subroutine if I know that I've
already created the unnamed version. C<bar_sub> is like any
other brick:

=cut

sub Brick::Bucket::_bar_sub
	{
	my( $bucket, $setup ) = @_;
	
	my( $foo_sub ) = $bucket->get_brick_by_name( 'FooSub' );
	isa_ok( $foo_sub, ref sub {} );
	
	my $this_sub = $bucket->add_to_bucket( {
		name        => "_bar_sub",
		unique      => 1,
		description => "This is a brick I made in _bar_sub",
		code        => sub { 
			$_[0]->{number} == 3 ? 1 : die {
				handler => 'FooSub',
				message => "Number wasn't 3",
				}
			},
		} );
	isa_ok( $this_sub, ref sub {} );

	my $composed = $bucket->__compose_satisfy_all(
		$foo_sub,
		$this_sub,
		);
	}

my $bar_sub = $bucket->_bar_sub;
isa_ok( $composed, ref sub {} );

