Class: Origen::SubBlocks::Placeholder

Inherits:
Object
  • Object
show all
Defined in:
lib/origen/sub_blocks.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(owner, name, attributes) ⇒ Placeholder

Returns a new instance of Placeholder.



473
474
475
476
477
# File 'lib/origen/sub_blocks.rb', line 473

def initialize(owner, name, attributes)
  @owner = owner
  @name = name
  @attributes = attributes
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args, &block) ⇒ Object



504
505
506
# File 'lib/origen/sub_blocks.rb', line 504

def method_missing(method, *args, &block)
  materialize.send(method, *args, &block)
end

Instance Attribute Details

#attributesObject (readonly)

Returns the value of attribute attributes.



471
472
473
# File 'lib/origen/sub_blocks.rb', line 471

def attributes
  @attributes
end

#nameObject (readonly)

Returns the value of attribute name.



471
472
473
# File 'lib/origen/sub_blocks.rb', line 471

def name
  @name
end

#ownerObject (readonly)

Returns the value of attribute owner.



471
472
473
# File 'lib/origen/sub_blocks.rb', line 471

def owner
  @owner
end

Instance Method Details

#==(obj) ⇒ Object Also known as: equal?



527
528
529
530
531
532
533
# File 'lib/origen/sub_blocks.rb', line 527

def ==(obj)
  if obj.is_a?(Placeholder)
    materialize == obj.materialize
  else
    materialize == obj
  end
end

#add_attributes(attrs) ⇒ Object



479
480
481
# File 'lib/origen/sub_blocks.rb', line 479

def add_attributes(attrs)
  @attributes = @attributes.merge(attrs)
end

#classObject

Make this appear like a sub-block to any application code



484
485
486
# File 'lib/origen/sub_blocks.rb', line 484

def class
  klass
end

#cloneObject



540
541
542
# File 'lib/origen/sub_blocks.rb', line 540

def clone
  materialize.clone
end

#dupObject



544
545
546
# File 'lib/origen/sub_blocks.rb', line 544

def dup
  materialize.dup
end

#freezeObject



536
537
538
# File 'lib/origen/sub_blocks.rb', line 536

def freeze
  materialize.freeze
end

#inspectObject

Make it look like a sub-block in the console to avoid confusion



500
501
502
# File 'lib/origen/sub_blocks.rb', line 500

def inspect
  "<SubBlock: #{name}>"
end

#is_a?(klass) ⇒ Boolean

Make this appear like a sub-block to any application code

Returns:

  • (Boolean)


489
490
491
492
493
494
495
496
497
# File 'lib/origen/sub_blocks.rb', line 489

def is_a?(klass)
  # Because sub_blocks are stored in a hash.with_indifferent_access, the value is tested
  # against being a Hash or Array when it is added to the hash. This prevents the class being
  # looking up and loaded by the autoload system straight away, especially if the sub-block
  # has been specified to lazy load
  return false if klass == Hash || klass == Array

  klass == self.klass || klass == Placeholder
end

#klassObject



552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
# File 'lib/origen/sub_blocks.rb', line 552

def klass
  @klass ||= begin
    class_name = attributes.delete(:class_name)
    tmp_class = nil
    if class_name
      begin
        tmp_class = "::#{owner.namespace}::#{class_name}"
        klass = eval(tmp_class)
      rescue NameError => e
        raise if e.message !~ /^uninitialized constant (.*)$/ || tmp_class !~ /#{Regexp.last_match(1)}/

        begin
          tmp_class = "::#{class_name}"
          klass = eval(tmp_class)
        rescue NameError => e
          raise if e.message !~ /^uninitialized constant (.*)$/ || tmp_class !~ /#{Regexp.last_match(1)}/

          begin
            tmp_class = "#{owner.class}::#{class_name}"
            klass = eval(tmp_class)
          rescue NameError => e
            raise if e.message !~ /^uninitialized constant (.*)$/ || tmp_class !~ /#{Regexp.last_match(1)}/

            puts "Could not find class: #{class_name}"
            raise 'Unknown sub block class!'
          end
        end
      end
    else
      klass = Origen::SubBlock
    end
    unless klass.respond_to?(:includes_origen_model)
      puts 'Any class which is to be instantiated as a sub_block must include Origen::Model,'
      puts "add this to #{klass}:"
      puts ''
      puts '  include Origen::Model'
      puts ''
      fail 'Sub block does not include Origen::Model!'
    end
    klass
  end
end

#materializeObject



512
513
514
515
516
517
518
519
520
521
522
523
524
525
# File 'lib/origen/sub_blocks.rb', line 512

def materialize
  block = nil
  file = attributes.delete(:file)
  load_block = attributes.delete(:load_block)
  dir = attributes.delete(:dir) || owner.send(:export_dir)
  block = owner.send(:instantiate_sub_block, name, klass, attributes)
  if file
    require File.join(dir, file)
    block.extend owner.send(:export_module_names_from_path, file).join('::').constantize
  end
  block.load_block(load_block) if load_block
  block.owner = owner
  block
end

#respond_to?(method, include_private = false) ⇒ Boolean

Returns:

  • (Boolean)


508
509
510
# File 'lib/origen/sub_blocks.rb', line 508

def respond_to?(method, include_private = false)
  materialize.respond_to?(method, include_private)
end

#to_json(*args) ⇒ Object



548
549
550
# File 'lib/origen/sub_blocks.rb', line 548

def to_json(*args)
  materialize.to_json(*args)
end