require 'evernote-thrift' class NoteMeta [:updated, :created, :title, :notebookGuid, :guid, :contentLength, :tagGuids].each do |method| define_method method do iv_name = "@#{method}" value = instance_variable_get iv_name unless value value = instance_variable_get("@meta").send method instance_variable_set iv_name, value end value end end def initialize meta, note_store @meta = meta @store = note_store end def tags @tags ||= (tagGuids ? tagGuids.map{|id| @store.tag_name id} : []) end def book @book ||= @store.book_name notebookGuid end def stack @stack = (instance_variable_defined? :@stack) ? @stack : @store.stack_name(notebookGuid) end def to_h @h = attr_methods.each_with_object({}) do |method, hash| hash[method] = send method end end def marshal_dump to_h end def marshal_load hash hash.each do |key, value| instance_variable_set "@#{key}", value end end private def attr_methods self.class.instance_methods(false) - [:to_h, :marshal_dump, :marshal_load] end end