Aion

 view release on metacpan or  search on metacpan

lib/Aion.pm  view on Meta::CPAN


=back

File lib/CounterEon.pm:

	package CounterEon;
	#@eon ex.counter
	use Aion;
	
	has accomulator => (isa => 'AccomulatorEon', eon => 1);
	
	1;

File lib/AccomulatorEon.pm:

	package AccomulatorEon;
	#@eon
	use Aion;
	
	has power => (isa => 'PowerEon', eon => 2);
	
	1;

lib/PowerEon.pm file:

	package PowerEon;
	use Aion;
	
	has counter => (eon => 'ex.counter');
		
	#@eon
	sub power { shift->new }
	
	1;

We use pleroma locally:

	{
		use Aion::Pleroma;
		my $pleroma = Aion::Pleroma->new(ini => undef, pleroma => {
			'ex.counter' => 'CounterEon#new',
			AccomulatorEon => 'AccomulatorEon#new',
			'PowerEon#power' => 'PowerEon#power',
		});
	
		local *Aion::pleroma = sub { $pleroma };
		
		my $counter = Aion->pleroma->get('ex.counter');
	
		$counter->accomulator->power->counter # -> $counter
	}
	
	Aion->pleroma->get('ex.counter') # -> undef

See L<Aion::Pleroma>.

=head2 trigger => $sub

C<$sub> is called after setting the property in the constructor (C<new>) or via a setter.

The etymology of C<trigger> is to let in.

	package ExTrigger { use Aion;
		has x => (trigger => sub {
			my ($self, $old_value) = @_;
			$self->y($old_value + $self->x);
		});
	
		has y => ();
	}
	
	my $ex = ExTrigger->new(x => 10);
	$ex->y	  # -> 10
	$ex->x(20);
	$ex->y	  # -> 30

=head2 release => $sub

C<$sub> is called before returning a property from an object via a getter.

The etymology of C<release> is to release.

	package ExRelease { use Aion;
		has x => (release => sub {
			my ($self, $value) = @_;
			$_[1] = $value + 1;
		});
	}
	
	my $ex = ExRelease->new(x => 10);
	$ex->x	  # -> 11

=head2 init_arg => $name

Changes the property name in the constructor.

	package ExInitArg { use Aion;
		has x => (is => 'ro+', init_arg => 'init_x');
	
		ExInitArg->new(init_x => 10)->x # -> 10
	}

=head2 accessor => $name

Changes the accessor name.

	package ExAccessor { use Aion;
		has x => (is => 'rw', accessor => '_x');
	
		ExAccessor->new->_x(10)->_x # -> 10
	}

=head2 writer => $name

Creates a setter named C<$name> for a property.

	package ExWriter { use Aion;
		has x => (is => 'ro', writer => '_set_x');
	
		ExWriter->new->_set_x(10)->x # -> 10
	}

=head2 reader => $name

Creates a getter named C<$name> for a property.

	package ExReader { use Aion;
		has x => (is => 'wo', reader => '_get_x');
	
		ExReader->new(x => 10)->_get_x # -> 10
	}

=head2 predicate => $name

Creates a predicate named C<$name> for a property. You can also create a predicate with a standard name using C<< is =E<gt> '?' >>.

	package ExPredicate { use Aion;
		has x => (predicate => '_has_x');
		
		my $ex = ExPredicate->new;
		$ex->_has_x        # -> ""



( run in 1.390 second using v1.01-cache-2.11-cpan-98e64b0badf )