# ------------------------------------------------------------------------------ # (C) British Crown Copyright 2006-17 Met Office. # # This file is part of FCM, tools for managing and building source code. # # FCM is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # # FCM is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with FCM. If not, see . # ------------------------------------------------------------------------------ use strict; use warnings; # ------------------------------------------------------------------------------ package FCM::Context::Keyword; use base qw{FCM::Class::HASH}; use constant { BROWSER_CONFIG => 'FCM::Context::Keyword::BrowserConfig', ENTRY => 'FCM::Context::Keyword::Entry', ENTRY_OF_LOCATION => 'FCM::Context::Keyword::Entry::Location', }; use Scalar::Util qw{blessed}; __PACKAGE__->class({ entry_class => {w => 0, isa => '$', default => ENTRY_OF_LOCATION}, entry_by_key => {w => 0, isa => '%'}, entry_by_value => {w => 0, isa => '%'}, }); sub add_entry { my $self = shift(); my ($key, $value, $entry); if (blessed($_[0])) { $entry = $_[0]; $key = $entry->get_key(); $value = $entry->get_value(); } else { ($key, $value, my $attrib_ref) = @_; $attrib_ref ||= {}; $entry = $self->get_entry_class()->new({ key => lc($key), value => $value, %{$attrib_ref}, }); } $self->{entry_by_key}{lc($key)} = $entry; $self->{entry_by_value}{$value} = $entry; return $entry; } # ------------------------------------------------------------------------------ package FCM::Context::Keyword::BrowserConfig; use base qw{FCM::Class::HASH}; __PACKAGE__->class({comp_pat => undef, loc_tmpl => '$', rev_tmpl => '$'}); # ------------------------------------------------------------------------------ package FCM::Context::Keyword::Entry; use base qw{FCM::Class::HASH}; __PACKAGE__->class({ key => {w => 0, isa => '$'}, value => {w => 0, isa => '$'}, }); # ------------------------------------------------------------------------------ package FCM::Context::Keyword::Entry::Location; use base qw{FCM::Context::Keyword::Entry}; my $CTX = 'FCM::Context::Keyword'; __PACKAGE__->class( { browser_config => $CTX->BROWSER_CONFIG, ctx_of_implied => $CTX, ctx_of_rev => $CTX, implied => {isa => '$', default => 0}, key => {isa => '$', w => 0}, loaded_rev_prop => '$', type => '$', value => {isa => '$', w => 0}, }, { init => sub { my ($self) = @_; if (!$self->get_implied()) { $self->{browser_config} = $CTX->BROWSER_CONFIG->new(); $self->{ctx_of_implied} = $CTX->new(); $self->{ctx_of_rev} = $CTX->new({entry_class => $CTX->ENTRY}); } }, }, ); # Returns true if this is an implied entry sub is_implied { $_[0]->{implied}; } # ------------------------------------------------------------------------------ 1; __END__ =head1 NAME FCM::Context::Keyword =head1 SYNOPSIS use FCM::Context::Keyword; =head1 DESCRIPTION Provides a context object for the FCM keyword utility. All the classes described below are sub-classes of L. =head1 OBJECTS =head2 FCM::Context::Keyword An object of this class is used to store a list of keyword entries. It has the following methods: =over 4 =item $instance->add_entry($key,$value,\%attrib) Creates and adds a new entry. =item $instance->add_entry($entry) Adds a new entry. =item $instance->get_entry_class() Returns the class of the entry stored by this context. =item $instance->get_entry_by_key() Returns a HASH reference to map the entry keys with the entry objects. =item $instance->get_entry_by_value() Returns a HASH reference to map the entry values with the entry objects. =back =head2 FCM::Context::Keyword::BrowserConfig An object of this class is used to store the configuration for mapping a location to a browser URL. It has the following attributes: =over 4 =item comp_pat The pattern for extracting components from a locator, for putting into the browser location template. =item loc_tmpl The browser location template. =item rev_tmpl The browser revision template. =back =head2 FCM::Context::Keyword::Entry This is used to store a simple keyword entry (e.g. for revision keywords). It has 2 attributes, the I and the I. =head2 FCM::Context::Keyword::Entry::Location This is a sub-class of FCM::Context::Keyword::Entry, and is used to store a location keyword entry. It has the following additional attributes: =over 4 =item browser_config The configuration L for mapping this location to a browser URL. =item ctx_of_implied The context object of the implied entries, if this entry is a primary location. =item ctx_of_rev The context object of the revision keywords. =item implied A flag to indicate that this is an entry implied by a primary location. =item loaded_rev_prop A flag to indicate that a previous attempt is made to load revision keywords from the I of the location. =item type The location type. =back =head1 COPYRIGHT (C) Crown copyright Met Office. All rights reserved. =cut