NAME
Evo::Comp::Out
VERSION
version 0.0190
DESCRIPTION
Inside-out driver for Evo::Comp using Hash::Util::FieldHash. Makes possible to use any type of references as component intances.
SYNOPSYS
package main;
use Evo;
{
package My::Spy;
use Evo '-Comp::Out *';
has 'foo', required => 1;
}
my $foo = My::Spy::init(sub { say "foo" }, foo => 'FOO');
say $foo->foo;
$foo->();
FEATURES
Evo::Comp::Out supports the same features as Evo::Comp::Hash, but is a little (20-30%, maybe twice), slower. But allow to use any references, that can be blessed, as component instances
init
Instead of new, it provides init. So you can desing new, for example, as a clousure by yourself
EXAMPLE
In this example we created spy object, that logs all invocations. You can make the similar thing with overloading with the hash-class too, but this implementation has one advantage: it's a real codered and reftype returns CODE, not HASH.
package main;
use Evo;
use Scalar::Util 'reftype';
{
package My::Spy;
use Evo '-Comp::Out *';
use Scalar::Util 'weaken';
has calls => sub { [] };
has 'fn', required => 1;
sub new {
my $copy;
$copy = my $sub = sub { push $copy->calls->@*, [@_]; $copy->fn->(@_); };
weaken $copy;
init($sub, @_);
$sub;
}
}
my $spy = My::Spy::new(fn => sub { local $, = ';'; say "hello", @_ });
say reftype $spy;
$spy->();
$spy->(1);
$spy->(1, 2);
local $, = '';
say "logged: ", $_->@* for $spy->calls->@*;
AUTHOR
alexbyk.com
COPYRIGHT AND LICENSE
This software is copyright (c) 2016 by alexbyk.
This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself.