use strict; use warnings FATAL => 'all'; package MarpaX::Languages::ECMAScript::AST::Impl::Singleton; use base 'Class::Singleton'; use Sereal qw/encode_sereal decode_sereal/; use Data::Compare qw//; use Marpa::R2 2.078000; use Log::Any qw/$log/; # ABSTRACT: Singleton hosting all the grammar precompiled Marpa::R2::Scanless::G objects our $VERSION = '0.020'; # VERSION sub _new_instance { my ($class) = @_; my $self = bless {_G => {} }, $class; return $self; } sub G { my ($self, $grammarOptionsHashp) = @_; $grammarOptionsHashp //= {}; # # Search the key # my $key = undef; foreach (keys %{$self->{_G}}) { my $thisKey = $_; my $thisOptionsHashp = decode_sereal($thisKey); my $c = new Data::Compare($grammarOptionsHashp, $thisOptionsHashp); if ($c->Cmp) { $key = $thisKey; last; } } # # Create a new key if necessary # if (! defined($key)) { $log->debugf('Creating grammar key'); $key = encode_sereal($grammarOptionsHashp); } if (! defined($self->{_G}->{$key})) { # # Create the grammar object # $log->debugf('Creating grammar object'); $self->{_G}->{$key} = Marpa::R2::Scanless::G->new($grammarOptionsHashp); } else { $log->debugf('Found cached grammar object'); } return $self->{_G}->{$key}; } 1; __END__ =pod =encoding UTF-8 =head1 NAME MarpaX::Languages::ECMAScript::AST::Impl::Singleton - Singleton hosting all the grammar precompiled Marpa::R2::Scanless::G objects =head1 VERSION version 0.020 =head1 DESCRIPTION This modules is a singleton used for caching all precompiled Marpa::R2::Scanless::G objects. =head1 SUBROUTINES/METHODS =head2 G($self, $grammarOptionsHashp) Cached Marpa::R2::Scanless::G object for grammar with options $grammarOptionsHashp. =head1 AUTHOR Jean-Damien Durand =head1 COPYRIGHT AND LICENSE This software is copyright (c) 2013 by Jean-Damien Durand. This is free software; you can redistribute it and/or modify it under the same terms as the Perl 5 programming language system itself. =cut