NAME
Class::Accessor::Inherited::XS - fast XS inherited accessors
SYNOPSIS
#install accessors at compile time
use Class::Accessor::Inherited::XS
inherited => [qw/foo bar/], # here key names are equal to accessor names
;
use Class::Accessor::Inherited::XS {
inherited => {
bar => 'bar_key',
foo => 'foo_key',
},
};
#or in a Class::Accessor::Grouped-like fashion
use parent 'Class::Accessor::Inherited::XS';
__PACKAGE__->mk_inherited_accessors('foo', ['bar', 'bar_key']);
DESCRIPTION
This module provides very fast implementation for 'inherited' accessors, that were introduced in Class::Accessor::Grouped. They give you capability to override values set in a parent class with values set in childs or object instances. Generated accessors are compatible with Class::Accessor::Grouped generated ones.
Since this module focuses primary on speed, it provides no capability to have your own per-class getters/setters logic (like overriding get_inherited/set_inherited in Class::Accessor::Grouped).
UTF-8
Starting with perl 5.16.0, this module provides full support for UTF-8 method names and hash keys. Before that, you can't distinguish UTF-8 strings from bytes string in method names, only in hash keys. You have been warned.
THREADS
Though highly discouraged, perl threads are supported by Class::Accessor::Inherited::XS. You may have accessors with the same names pointing to differents keys in different threads, etc. There are no known conceptual leaks.
PERFORMANCE
Class::Accessor::Inherited::XS is 5-12x times faster than Class::Accessor::Grouped, depending on your usage pattern. Accessing data from a parent in large inheritance chain is still the worst case, but even there Class::Accessor::Inherited::XS beats Class::Accessor::Grouped best-case.
Here are results from the benchmark run on perl 5.20.1 (see bench folder):
Rate pkg_gparent_cag pkg_cag obj_cag pkg_set_cag pkg_gparent_caixs pkg_caix pkg_set_caix obj_caix obj_cxa obj_direct
pkg_gparent_cag 238597/s -- -76% -80% -82% -91% -97% -97% -98% -99% -99%
pkg_cag 998731/s 319% -- -18% -25% -64% -86% -86% -92% -94% -95%
obj_cag 1223277/s 413% 22% -- -8% -56% -83% -83% -91% -93% -94%
pkg_set_cag 1323322/s 455% 33% 8% -- -52% -82% -82% -90% -92% -93%
pkg_gparent_caixs 2752510/s 1054% 176% 125% 108% -- -62% -63% -79% -84% -86%
pkg_caix 7281773/s 2952% 629% 495% 450% 165% -- -1% -44% -56% -64%
pkg_set_caix 7349827/s 2980% 636% 501% 455% 167% 1% -- -44% -56% -64%
obj_caix 13008746/s 5352% 1203% 963% 883% 373% 79% 77% -- -22% -36%
obj_cxa 16733631/s 6913% 1575% 1268% 1165% 508% 130% 128% 29% -- -17%
obj_direct 20201922/s 8367% 1923% 1551% 1427% 634% 177% 175% 55% 21% --
SEE ALSO
COPYRIGHT AND LICENSE
Copyright (C) 2009 by Vladimir Timofeev
Copyright (C) 2014 by Sergey Aleynikov
This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself, either Perl version 5.10.1 or, at your option, any later version of Perl 5 you may have available.