1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
|
#!/usr/bin/perl
use v5.18;
use warnings;
use Test2::V0;
use Object::Pad 0.800 ':experimental(mop inherit_field)';
use Object::Pad::MetaFunctions qw(
metaclass
deconstruct_object
ref_field
get_field
);
class Point {
field $x :param = 0;
field $y :param = 0;
}
is( metaclass( Point->new ), Object::Pad::MOP::Class->for_class( "Point" ),
'metaclass() returns Point metaclass' );
class AllFieldTypes {
field $s = "scalar";
field @a = ( "array", "values" );
field %h = ( key => "value" );
}
is( [ deconstruct_object( AllFieldTypes->new ) ],
[ 'AllFieldTypes',
'AllFieldTypes.$s' => "scalar",
'AllFieldTypes.@a' => [ "array", "values" ],
'AllFieldTypes.%h' => { key => "value" } ],
'deconstruct_object on AllFieldTypes' );
class AClass {
field $a = "a";
}
role BRole {
field $b = "b";
}
class CClass {
inherit AClass;
apply BRole;
field $c = "c";
}
is( [ deconstruct_object( CClass->new ) ],
[ 'CClass',
'CClass.$c' => "c",
'BRole.$b' => "b",
'AClass.$a' => "a", ],
'deconstruct_object on CClass' );
# Inherited fields don't deconstruct
{
class DClass {
field $x :inheritable;
}
class EClass {
inherit DClass qw( $x );
ADJUST { $x = 123; }
}
is( [ deconstruct_object( EClass->new ) ],
[ 'EClass',
'DClass.$x' => 123, ],
'deconstruct_object does not dump inherited fields' );
}
# ref_field
{
my $obj = AllFieldTypes->new;
is( ref_field( 'AllFieldTypes.$s', $obj ), \"scalar",
'ref_field on scalar field' );
is( ref_field( 'AllFieldTypes.@a', $obj ), [ "array", "values" ],
'ref_field on array field' );
is( ref_field( 'AllFieldTypes.%h', $obj ), { key => "value" },
'ref_field on hash field' );
is( ref_field( '$s', $obj ), \"scalar",
'ref_field short name' );
is( ref_field( 'BRole.$b', CClass->new ), \"b",
'ref_field can search roles' );
}
# get_field
{
my $obj = AllFieldTypes->new;
is( get_field( '$s', $obj ), "scalar",
'get_field on scalar field' );
is( [ get_field( '@a', $obj ) ], [ "array", "values" ],
'get_field on array field' );
is( scalar get_field( '@a', $obj ), 2,
'scalar get_field on array field' );
# Before perl 5.26 hashes in scalar context would yield a string like
# 'KEYCOUNT/BUCKETCOUNT'. We can't be sure what the bucket count will be
# here
my $scalar_hash_re = ( $] < 5.026 ) ? qr(^1/\d+$) : qr(^1$);
is( { get_field( '%h', $obj ) }, { key => "value" },
'get_field on hash field' );
like( scalar get_field( '%h', $obj ), $scalar_hash_re,
'scalar get_field on hash field' );
}
done_testing;
|